home *** CD-ROM | disk | FTP | other *** search
/ Linux Cubed Series 4: GNU Archives / Linux Cubed Series 4 - GNU Archives.iso / gnu / cvs-1.8 / cvs-1 / cvs-1.8.1 / src / root.c < prev    next >
Encoding:
C/C++ Source or Header  |  1996-05-06  |  4.2 KB  |  178 lines

  1. /*
  2.  * Copyright (c) 1992, Mark D. Baushke
  3.  *
  4.  * You may distribute under the terms of the GNU General Public License as
  5.  * specified in the README file that comes with the CVS 1.4 kit.
  6.  * 
  7.  * Name of Root
  8.  * 
  9.  * Determine the path to the CVSROOT and set "Root" accordingly.
  10.  * If this looks like of modified clone of Name_Repository() in
  11.  * repos.c, it is... 
  12.  */
  13.  
  14. #include "cvs.h"
  15.  
  16. char *
  17. Name_Root(dir, update_dir)
  18.      char *dir;
  19.      char *update_dir;
  20. {
  21.     FILE *fpin;
  22.     char *ret, *xupdate_dir;
  23.     char root[PATH_MAX];
  24.     char tmp[PATH_MAX];
  25.     char cvsadm[PATH_MAX];
  26.     char *cp;
  27.  
  28.     if (update_dir && *update_dir)
  29.     xupdate_dir = update_dir;
  30.     else
  31.     xupdate_dir = ".";
  32.  
  33.     if (dir != NULL)
  34.     {
  35.     (void) sprintf (cvsadm, "%s/%s", dir, CVSADM);
  36.     (void) sprintf (tmp, "%s/%s", dir, CVSADM_ROOT);
  37.     }
  38.     else
  39.     {
  40.     (void) strcpy (cvsadm, CVSADM);
  41.     (void) strcpy (tmp, CVSADM_ROOT);
  42.     }
  43.  
  44.     /*
  45.      * Do not bother looking for a readable file if there is no cvsadm
  46.      * directory present.
  47.      *
  48.      * It is possible that not all repositories will have a CVS/Root
  49.      * file. This is ok, but the user will need to specify -d
  50.      * /path/name or have the environment variable CVSROOT set in
  51.      * order to continue.
  52.      */
  53.     if ((!isdir (cvsadm)) || (!isreadable (tmp)))
  54.     {
  55.     if (CVSroot == NULL)
  56.     {
  57.         error (0, 0, "in directory %s:", xupdate_dir);
  58.         error (0, 0, "must set the CVSROOT environment variable");
  59.         error (0, 0, "or specify the '-d' option to %s.", program_name);
  60.     }
  61.     return (NULL);
  62.     }
  63.  
  64.     /*
  65.      * The assumption here is that the CVS Root is always contained in the
  66.      * first line of the "Root" file.
  67.      */
  68.     fpin = open_file (tmp, "r");
  69.  
  70.     if (fgets (root, PATH_MAX, fpin) == NULL)
  71.     {
  72.     error (0, 0, "in directory %s:", xupdate_dir);
  73.     error (0, errno, "cannot read %s", CVSADM_ROOT);
  74.     error (0, 0, "please correct this problem");
  75.     return (NULL);
  76.     }
  77.     (void) fclose (fpin);
  78.     if ((cp = strrchr (root, '\n')) != NULL)
  79.     *cp = '\0';            /* strip the newline */
  80.  
  81.     /*
  82.      * root now contains a candidate for CVSroot. It must be an
  83.      * absolute pathname
  84.      */
  85.  
  86. #ifdef CLIENT_SUPPORT
  87.     /* It must specify a server via remote CVS or be an absolute pathname.  */
  88.     if ((strchr (root, ':') == NULL)
  89.         && ! isabsolute (root))
  90. #else /* ! CLIENT_SUPPORT */
  91.     if (root[0] != '/')
  92. #endif /* CLIENT_SUPPORT */
  93.     {
  94.     error (0, 0, "in directory %s:", xupdate_dir);
  95.     error (0, 0,
  96.            "ignoring %s because it does not contain an absolute pathname.",
  97.            CVSADM_ROOT);
  98.     return (NULL);
  99.     }
  100.  
  101. #ifdef CLIENT_SUPPORT
  102.     if ((strchr (root, ':') == NULL) && !isdir (root))
  103. #else /* ! CLIENT_SUPPORT */
  104.     if (!isdir (root))
  105. #endif /* CLIENT_SUPPORT */
  106.     {
  107.     error (0, 0, "in directory %s:", xupdate_dir);
  108.     error (0, 0,
  109.            "ignoring %s because it specifies a non-existent repository %s",
  110.            CVSADM_ROOT, root);
  111.     return (NULL);
  112.     }
  113.  
  114.     /* allocate space to return and fill it in */
  115.     strip_path (root);
  116.     ret = xstrdup (root);
  117.     return (ret);
  118. }
  119.  
  120. /*
  121.  * Returns non-zero if the two directories have the same stat values
  122.  * which indicates that they are really the same directories.
  123.  */
  124. int
  125. same_directories (dir1, dir2)
  126.      char *dir1;
  127.      char *dir2;
  128. {
  129.     struct stat sb1;
  130.     struct stat sb2;
  131.     int ret;
  132.  
  133.     if (stat (dir1, &sb1) < 0)
  134.         return (0);
  135.     if (stat (dir2, &sb2) < 0)
  136.         return (0);
  137.     
  138.     ret = 0;
  139.     if ( (memcmp( &sb1.st_dev, &sb2.st_dev, sizeof(dev_t) ) == 0) &&
  140.      (memcmp( &sb1.st_ino, &sb2.st_ino, sizeof(ino_t) ) == 0))
  141.         ret = 1;
  142.  
  143.     return (ret);
  144. }
  145.  
  146.  
  147. /*
  148.  * Write the CVS/Root file so that the environment variable CVSROOT
  149.  * and/or the -d option to cvs will be validated or not necessary for
  150.  * future work.
  151.  */
  152. void
  153. Create_Root (dir, rootdir)
  154.      char *dir;
  155.      char *rootdir;
  156. {
  157.     FILE *fout;
  158.     char tmp[PATH_MAX];
  159.  
  160.     if (noexec)
  161.     return;
  162.  
  163.     /* record the current cvs root */
  164.  
  165.     if (rootdir != NULL)
  166.     {
  167.         if (dir != NULL)
  168.         (void) sprintf (tmp, "%s/%s", dir, CVSADM_ROOT);
  169.         else
  170.         (void) strcpy (tmp, CVSADM_ROOT);
  171.         fout = open_file (tmp, "w+");
  172.         if (fprintf (fout, "%s\n", rootdir) < 0)
  173.         error (1, errno, "write to %s failed", tmp);
  174.         if (fclose (fout) == EOF)
  175.         error (1, errno, "cannot close %s", tmp);
  176.     }
  177. }
  178.